package com.cskaoyan.javase.oop3._0abstract._3exercise;

/**
 * 公司正在开发一套员工管理系统，需要对公司内部存在的员工进行管理
 * 公司将员工分为三类，普通员工负责杂项工作，程序员负责技术开发，经理负责统筹规划
 *      1.普通员工包含3个属性：姓名、工号以及工资，行为是工作
 *      2.程序员包含3个属性：姓名、工号以及工资，行为是工作和加班（overtime work）
 *      3.经理包含4个属性：姓名、工号、工资以及奖金（bonus），行为是工作
 *      这里需要定义一个抽象的父类,定义抽象的好处至少有:
 *          a.抽象类的对象不存在,所以具体员工的行为属性变化不会影响到抽象父类
 *          b.抽象类有抽象方法,制定"标准,规范"的作用
 *
 * 请使用所学的知识设计该员工系统
 * 要求类中提供必要的方法进行属性访问（description）
 *
 *
 * @since 16:34
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        BaseStaff bs;
        bs = new NormalStaff("张三", 100, 10000);
        bs.work();
        bs.print();
        bs = new Coder("李四", 200, 100000);
        bs.work();
        if (bs instanceof Coder) {
            Coder c = (Coder) bs;
            c.overTimeWork();
        }
        bs.print();
        bs = new Manager("王二", 300, 200000, 1000000);
        bs.work();
        if (bs instanceof Manager) {
            Manager m = (Manager) bs;
            System.out.println(m.bonus);
        }
        bs.print();
    }
}

// 抽象的员工类
abstract class BaseStaff {
    String name;
    int id;
    double salary;

    public abstract void work();

    public BaseStaff(String name, int id, double salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
    }

    // 定义实现方法
    public void print() {
        System.out.println("工号是" + id + "的员工" + name + ",他的工资是" + salary);
    }
}

class NormalStaff extends BaseStaff {
    @Override
    public void work() {
        System.out.println("负责杂项工作");
    }

    public NormalStaff(String name, int id, double salary) {
        super(name, id, salary);
    }
}

class Coder extends BaseStaff {
    @Override
    public void work() {
        System.out.println("负责写代码");
    }

    public void overTimeWork() {
        System.out.println("程序员在加班,996~");
    }

    public Coder(String name, int id, double salary) {
        super(name, id, salary);
    }
}

class Manager extends BaseStaff {
    double bonus;

    public Manager(String name, int id, double salary, double bonus) {
        super(name, id, salary);
        this.bonus = bonus;
    }

    @Override
    public void work() {
        System.out.println("负责统筹规划");
    }

    @Override
    public void print() {
        System.out.println("工号是" + id + "的员工" + name + ",他的工资是" + (salary + bonus));
    }
}